package sgsi.controller.dao.impl;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.List;

import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import sgsi.controller.dao.ReporteDao;
import sgsi.util.Constantes;
import sgsi.view.reportes.VistaReporteCapacidadArea;
import sgsi.view.reportes.VistaReportePalet;

public class ReporteDaoJdbcImpl extends JdbcDaoSupport implements ReporteDao {

	@SuppressWarnings("unchecked")
	public List<VistaReportePalet> ejecutarReporteEgreso(int codigoCliente, int codigoArticulo, int codigoTipoDePalet,
			int motivoEgreso, Date fechaDesde, Date fechaHasta) {
		Object[] parametros = { codigoCliente, codigoArticulo, codigoTipoDePalet, motivoEgreso,
				safeNullMinimoFecha(fechaDesde), safeNullMaximaFecha(fechaHasta) };
		getJdbcTemplate().setFetchSize(1000);
		return getJdbcTemplate().query(Constantes.SP_REPORTE_EGRESOS, parametros,
				new VistaReporteEgresoPaletRowMapper());
	}

	@SuppressWarnings("unchecked")
	public List<VistaReportePalet> ejecutarReporteIngreso(int codigoCliente, int codigoArticulo, int codigoTipoDePalet,
			Date fechaDesde, Date fechaHasta) {

		Object[] parametros = { codigoCliente, codigoArticulo, codigoTipoDePalet, safeNullMinimoFecha(fechaDesde), safeNullMaximaFecha(fechaHasta) };
		getJdbcTemplate().setFetchSize(1000);

		return getJdbcTemplate().query(Constantes.SP_REPORTE_INGRESOS, parametros,
				new VistaReporteIngresoPaletRowMapper());

	}

	@SuppressWarnings("unchecked")
	public List<VistaReporteCapacidadArea> ejecutarReporteCapaciadAreas(String codigoAlmacen, String storeProcedure) {
		String[] parametros = { codigoAlmacen };
		getJdbcTemplate().setFetchSize(1000);
		return getJdbcTemplate().query(storeProcedure, parametros, new VistaReporteCapacidadAreaRowMapper());

	}

	private Object safeNullMinimoFecha(Date fechaDesde) {
		return safeNullFecha(fechaDesde, Date.valueOf(Constantes.FECHA_MINIMA_STR));
	}

	private Object safeNullMaximaFecha(Date fechaHasta) {
		return safeNullFecha(fechaHasta, Date.valueOf(Constantes.FECHA_MAXIMA_STR));
	}

	private Date safeNullFecha(Date fecha, Date defaultFechaminima) {
		return (fecha == null) ? defaultFechaminima : defaultFechaminima;
	}

	private String formatearFloat(float valor) {
		DecimalFormat formateador = new DecimalFormat("0.00");
		return formateador.format(valor);
	}

	private class VistaReporteEgresoPaletRowMapper implements ParameterizedRowMapper<VistaReportePalet> {

		public VistaReportePalet mapRow(ResultSet rs, int rowNum) throws SQLException {
			return new VistaReportePalet(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs
					.getString(5), formatearFloat(rs.getFloat(6)), formatearFloat(rs.getFloat(7)), rs.getString(8), rs
					.getString(9));
		}
	}

	private class VistaReporteIngresoPaletRowMapper implements ParameterizedRowMapper<VistaReportePalet> {

		public VistaReportePalet mapRow(ResultSet rs, int rowNum) throws SQLException {
			return new VistaReportePalet(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs
					.getString(5), formatearFloat(rs.getFloat(6)), formatearFloat(rs.getFloat(7)), rs.getString(8));
		}
	}

	private class VistaReporteCapacidadAreaRowMapper implements ParameterizedRowMapper<VistaReporteCapacidadArea> {

		public VistaReporteCapacidadArea mapRow(ResultSet rs, int rowNum) throws SQLException {
			return new VistaReporteCapacidadArea(rs.getString(1), rs.getString(2), formatearFloat(rs.getFloat(3)),
					formatearFloat(rs.getFloat(4)), formatearFloat(rs.getFloat(5)));
		}

	}

}
